Exception in thread "main" java.util.ConcurrentModificationException
Exception in thread "main" java.util.ConcurrentModificationException
บทความนี้เรามาดู Exception ที่เกิดขึ้นจากการรันโปรแกรมกันครับ ซึ่ง Exception นี้คือ ConcurrentModificationException ซึ่ง Exception นี้จะมีลักษณะข้อความคล้าย ๆ แบบนี้Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(Unknown Source) at com.doesystem.CodeFromDoesystem.main(CodeFromDoesystem.java:15)
จากข้อความ Exception ข้างบนเราสามารถแปลข้อความบางส่วนได้ ดังนี้
Exception เกิด Exception
thread "main" ก็คือ thread ที่ชื่อว่า main
ConcurrentModificationException อาจจะแยกได้ดังนี้ Concurrent คือ เกิดขึ้นพร้อมกัน Modification การปรับเปลี่ยน
ถ้านำมารวม ๆ กันแล้วอาจจะได้ว่า เกิด Exception ที่ thread main เป็น Exception ชนิด ConcurrentModificationException แล้วก็เกิดที่ Class ArrayList ซึ่งเป็นการเปลี่ยนแปลงแก้ไขข้อมูลพร้อมกันขณะที่อ่านข้อมูล
เมื่อเรามาดูโค้ดที่ทำให้เกิด Exception กันตามด้านล่าง
package com.doesystem; import java.util.ArrayList; import java.util.List; public class CodeFromDoesystem { public static void main(String[] args) throws Exception { ListtestList = new ArrayList () { { add("a"); add("b"); add("c"); } }; for (String str : testList) { System.out.println(str); testList.add("d"); } } }
จาก Exception และโค้ด เราเห็นจุดที่ทำให้เกิด Exception แล้ว จาก Exception มันบอกว่าอยู่บรรทัดที่ 15 เราก็ไปดูที่บรรทัดที่ 15 เป็นการวนลูปเพื่อนำข้อมูลของ List ออกมา แล้วลองไล่ลงมาดูอีกสองบรรทัดเป็นการ add ข้อมูลลงใน List
ตัวอย่างวิธีการแก้ไข
ตัวอย่างการแก้ไขตัวอย่างแรก ให้เราวนลูปค่าออกมาให้หมดก่อนแล้วค่อยแก้ไข หรือแก้ไขก่อน แล้วค่อยวนลูปดังตัวอย่างpackage com.doesystem; import java.util.ArrayList; import java.util.List; public class CodeFromDoesystem { public static void main(String[] args) throws Exception { ListtestList = new ArrayList () { { add("a"); add("b"); add("c"); } }; for (String str : testList) { System.out.println(str); //testList.add("d"); } testList.add("d"); } }
ตัวอย่างการแก้ไขตัวอย่างที่สอง ให้เราเปลี่ยน List มาเป็น CopyOnWriteArrayList ดังตัวอย่าง
package com.doesystem; import java.util.concurrent.CopyOnWriteArrayList; public class CodeFromDoesystem { public static void main(String[] args) throws Exception { CopyOnWriteArrayListtestList = new CopyOnWriteArrayList () { { add("a"); add("b"); add("c"); } }; for (String str : testList) { System.out.println(str); testList.add("d"); } } }